#ifndef	_ARH_KONTEKST_H_
#define	_ARH_KONTEKST_H_

#include "tipovi.h"

#define	POC_REG_STANJA	0x3202	//IF postavljen - dozvoljeni prekidi

//'stog' mora biti varijabla!
#define POCETAK_STOGA(stog, vel)	((void *) (((void *) stog) + (vel)))

#define STAVI_NA_STOG(stog, pod)	{	uint32 *ps = stog;	 \
						*(--ps) = (uint32) (pod);\
						stog = ps;		 \
					}

//konteks dretve - ono sto se na stogu nalazi kada se mjenja dretva (kada se 
//prekine te kasnije obnovi) - u prstenu 0!
typedef struct _kontekst_dretve_t_ {
	uint16 gs, fs, es, ds;
	uint32 registri[8];
	uint32 kod_greske;
	uint32 eip;
	uint32 cs;
	uint32 eflags;
	uint32 esp;
	uint32 ss;
} __attribute__((__packed__)) kontekst_dretve_t;

void *arh_dohvati_vrh_stoga_dretve(kontekst_dretve_t *kontekst);

// stog dretve mora biti spreman za povratak iz prekida
void arh_izgradi_prekidni_stog (void *stog, void *jstog, void *pb);

void *arh_dodaj_obradu (void *_kontekst, void *obrada, uint32 vp_na_stogu, ...);

//obnavljanje stoga (prekidnog) pri zavrsetku obrade dogadjaja
void arh_makni_obradu (void *_kontekst, void *vrh_stoga);

//ispis konteksta - za testiranje gornjih funkcija
void arh_ispisi_kontekst (void *_kontekst);

#endif	/* _ARH_KONTEKST_H_ */
